package com.itbaizhan.paymentdemo.task;

import com.itbaizhan.paymentdemo.entity.OrderInfo;
import com.itbaizhan.paymentdemo.service.IOrderInfoService;
import com.itbaizhan.paymentdemo.service.IWxPaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.List;

/*
* 微信任务调度 （开启定时器）
* 1，在主启动类 添加注解 @EnableScheduling
* 2，创建 任务类 ，类上加注解@Component， 方法上加注解@Scheduled(cron = )*/
@Component
@Slf4j
public class WxPaymentTask {

    @Autowired
    private IOrderInfoService  iOrderInfoService;

    @Autowired
    private IWxPaymentService iWxPaymentService;
    //秒 分 时 天 月 周
    @Scheduled(cron = "0/3 * * * * *")  //每三秒执行一次
    public void test(){

        log.info("test执行");
    }

    /*从0秒开始 每隔30秒执行一次，查询创建超过5分钟，并且没有支付的订单*/
    @Scheduled(cron = "0/30 * * * * *")
    public void  timeoutOrder() throws IOException {
        log.info("******开始查询过期订单*******");

        List<OrderInfo> timeOutOrder = iOrderInfoService.getTimeOutOrder(5);
        for(OrderInfo orderInfo: timeOutOrder){
           // System.out.println(orderInfo);
            //查询本地订单状态，与微信上的是否更新
            iWxPaymentService.checkOrderStatus(orderInfo.getOrderNo());
        }

    }

}

/*
* 什么是Spring Task
Spring 3.0后提供Spring Task实现任务调度。

Cron表达式
名称	藐视
Seconds (秒)	可以用数字0－59 表示
Minutes(分)	可以用数字0－59 表示
Hours(时)	可以用数字0-23表示
Day-of-Month(天)	可以用数字1-31 中的任一一个值，但要注意一些特别的月份
Month(月)	可以用0-11
Day-of-Week(每周)	以用数字1-7表示（1 ＝ 星期日）
参数：

* ： 表示所有值；
?： 表示未说明的值，即不关心它为何值；
-：表示一个指定的范围；
, ：表示附加一个可能值；
/ ：符号前表示开始时间，符号后表示每次递增的值；*/